Pinvon's Blog

所见, 所闻, 所思, 所想

Tkinter 学习笔记

概述

Tkinter 是 Python 的标准 GUI 库, 已内置到 Python 中.

创建一个 GUI 程序, 主要包括 4 个步骤:

  • 导入 Tkinter 模块
  • 创建控件
  • 指定这个控件的所有者
  • 告诉 GM(geometry manager) 有控件产生

创建主窗口

import tkinter as tk
window = tk.Tk()
window.mainloop()

还可以通过 window.title('my window') 和 window.geometry('200x100') 指定窗口的标题与大小.

Label

var = tk.StringVar()
var.set('my label')
label = tk.Label(
    window,                 # 标签的文字
    textvariable = var,     
    bg = 'green',           # 背景颜色
    font = ('Arial', 12),   # 字体和字体大小
    width = 15,             # 标签的长宽
    height = 2)
label.pack()                # 固定窗口位置

Button

on_hit = False
def hit_me():
    global on_hit
    if on_hit == False:
        on_hit = True
        var.set('you hit me')
    else:
        on_hit = False
        var.set('')

button = tk.Button(
    window,
    text='hit me',
    width=15,
    height=2,
    command=hit_me          # 点击按钮时触发hit_me事件
)
button.pack()

Entry

Entry 用于用户输入数据, 在这个例子中, 不论用户输入什么, 显示的都是 * 号.

entry = tk.Entry(
    window,
    show='*'
)
entry.pack()

Text

text = tk.Text(window, height=2)
text.pack()
text.insert('insert', 'pinvon')
text.insert('end', 'pinvon-end')

Listbox

创建 Listbox

var2 = tk.StringVar()
var2.set((11, 22, 33, 44))

# 创建 Listbox
listbox = tk.Listbox(
    window,
    listvariable=var2
)
listbox.pack()

插入 Listbox

listbox.insert('end', 'abc')  # 在末尾添加 abc
listbox.insert(2, 'second')

删除 Listbox 元素

listbox.delete(2)  # 删除第二个位置的元素

访问 Listbox 元素

listbox.curselection()  # 获取当前选中的元素
listbox.get(2)          # 获取索引为 2 的元素

Radiobutton

def print_selection():
    print(var2.get())

var2 = tk.StringVar()
radiobutton = tk.Radiobutton(
    window,
    text='Option A',
    variable=var2,
    value='A',
    command=print_selection
)
radiobutton.pack()

variable=var2, value='A' 的意思是, 当鼠标选中了该选项, 就把 value 的值 A 放到变量 var2 中, 然后赋值给 variable.

Scale(滚动条)

def print_selection(v):
    print(v)

scale = tk.Scale(
    window,
    label='try me',
    from_=5,
    to=11,
    orient=tk.HORIZONTAL,
    length=200,         # 长度: 200 个像素
    showvalue=1,        # 在滚动条上方显示值, 如果不显示, 改为 0
    tickinterval=2,     # 坐标间隔
    resolution=0.01,
    command=print_selection
)
scale.pack()

注意, Scale 的 command 参数会传递一个当前值给 print_selection().

Checkbutton

def print_selection():
    if (var2.get()==1):  # 选中第一个选项
        print('Python')

var2 = tk.IntVar()
checkbutton = tk.Checkbutton(
    window,
    text='Python',
    variable=var2,
    onvalue=1,
    offvalue=0,
    command=print_selection
)
checkbutton.pack()

当选中 checkbutton 后, onvalue 的值就会传给 var2, var2 再将这个值传给 variable. offvalue 是没选中 checkbutton 时放入 variable 的值.

Canvas(画布)

canvas = tk.Canvas(
    window,
    bg='blue',
    height=100,
    width=200
)
canvas.pack()

image_file = tk.PhotoImage(file='ins.gif')
image = canvas.create_image(
    10,10,          # 图片坐标
    anchor='nw',        # 图片锚点为左上角
    image=image_file)

line = canvas.create_line(  # 画直线
    50, 50,         # 起点
    80, 80)         # 终点

oval = canvas.create_oval(
    50, 50,
    80, 80,
    fill='red'
)

arc = canvas.create_arc(
    80, 80,
    110, 110,
    start=0,
    extent=180      # 扇形的度数
)

rect = canvas.create_rectangle(
    100, 30, 120, 50
)

如果要让画布内的某个实体移动, 可以使用类似 canvas.move(rect, 0, 2) 的语句, 在这里, rect 横坐标移动 0 个单个, 纵坐标移动 2 个单位.

Menubar(菜单栏)

def do_job():
    print('do_job')
menubar = tk.Menu(window)
filemenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='File', menu=filemenu)
filemenu.add_command(label='New', command=do_job)
filemenu.add_command(label='Open', command=do_job)
filemenu.add_command(label='Save', command=do_job)
filemenu.add_separator()
filemenu.add_command(label='Exit', command=window.quit)

submenu = tk.Menu(filemenu) # 子菜单
filemenu.add_cascade(label='Import', menu=submenu, underline=0)
submenu.add_command(label='Submenu1', command=do_job)
window.config(menu=menubar)

Frame

我们可以把 Frame 看成是一个容器. 可以在容器上放其他控件(包括另一个 Frame), 最后将 Frame 加载到 Window 即可.

frm = tk.Frame(window)
frm.pack()

frm1 = tk.Frame(frm)
frm2 = tk.Frame(frm)

frm1.pack(side='left')
frm2.pack(side='right')

tk.Label(frm, text='frm').pack()
tk.Label(frm1, text='frm1').pack()
tk.Label(frm2, text='frm2').pack()

messagebox

要使用 messagebox, 需要使用语句

import tkinter.messagebox

引入.

使用:

def hit_me():
    tk.messagebox.showinfo(title='Hi', message='pinvon')
tk.Button(
    window,
    text='hit me',
    command=hit_me
).pack()

pack, grid, place

我们可以通过 pack, grid, place 这三个方法来设置控件的位置.

pack

tk.Label(window, text='1').pack(side='top')

pack() 的 side 还可以有 bottom, left, right 这些属性.

grid

for i in range(4):
    for j in range(3):
        tk.Label(window, text=1).grid(
                row=i,
                column=j,
                padx=10,
                pady=10)

上面的代码创建了一个四行三列的表格, grid 通过表格的形式定位.

place

place 是直接以坐标为单位进行定位的.

tk.Label(
    window,
    text='1'
).place(
    x=20,
    y=10,
    anchor='nw'
)

Comments

使用 Disqus 评论
comments powered by Disqus